/**
 * dtable》支持记忆功能的checkbox类。
 * @param
 * @return
 * @author cjw 2020-06-11
 */
function CheckboxWithRemember(dtable) {
	let checkedIdArray = [];
	let checkedRowMap = {};
	
	/**
	 * 获取checkbox[check-all]对应的html字符串。
	 * @param
	 * @return
	 * @author cjw 2020-06-13
	 */
	this.getCheckAllStr = function getCheckAllStr() {
		let checkboxStr = '';
		checkboxStr = '<div class="pretty success" style="margin: 0;">' +
			'<input type="checkbox" class="checker check-all" onclick="checkboxWithRemember.addAndRemove(this);">' +
			'<label><i class="mdi mdi-check"></i></label>' +
			'</div>';
		return checkboxStr;
	};
	
	/**
	 * 获取checkbox[check-item]对应的html字符串。
	 * @param
	 * @return
	 * @author cjw 2020-06-11
	 */
	this.getCheckItemStr = function getCheckItemStr(id) {
		//翻页或其他加载操作后带出勾选状态
		id = String(id);
		let index = checkedIdArray.indexOf(id);
		let checkboxStr = '';
		
		if (index > -1) {
			checkboxStr = '<div class="pretty success" style="margin: 0;">' +
				'<input type="checkbox" class="checker check-item" checked data-id="' + id + '" onclick="checkboxWithRemember.addAndRemove(this);">' +
				'<label><i class="mdi mdi-check"></i></label>' +
				'</div>';
		} else {
			checkboxStr = '<div class="pretty success" style="margin: 0;">' +
				'<input type="checkbox" class="checker check-item" data-id="' + id + '" onclick="checkboxWithRemember.addAndRemove(this);">' +
				'<label><i class="mdi mdi-check"></i></label>' +
				'</div>';
		}
		return checkboxStr;
	};
	
	/**
	 * 用户点击checkbox时,更新checkedIdArray等变量。
	 * @param
	 * @return
	 * @author cjw 2020-06-11
	 */
	this.addAndRemove = function addAndRemove(obj) {
		stopPropagation();
		
		/**
		 * 若用户点击了checkbox[check-all]。
		 */
		let hasClassCheckAll = $(obj).hasClass("check-all");
		if (hasClassCheckAll == true) {
			//点击checkbox[check-all]时,更新checkedIdArray等变量。
			clickCheckAll(obj);
			return;
		}
		
		/**
		 * 若用户点击了checkbox[check-item]。
		 */
		//点击checkbox[check-item]时,更新checkedIdArray等变量。
		clickCheckItem(obj);
		return;
	};
	
	/**
	 * 点击checkbox[check-all]时,更新checkedIdArray等变量。
	 * @param
	 * @return
	 * @author cjw 2020-06-14
	 */
	function clickCheckAll(obj) {
		//若选中了checkbox
		if (obj.checked == true) {
            //将check-item样式的checkbox选中
			$(".checker.check-item").each(function () {
                this.checked = true;
                $(this).parents("tr").eq(0).addClass("chooseRow");
            });
			//存入check-item样式的checkbox的关联信息。
			$(".checker.check-item").each(function () {
				//存入id
				let id = $(this).data("id");
				let index = checkedIdArray.indexOf(id);
				if (index == -1) {
					checkedIdArray.push(id);
				}
				//存入row
				let hasKey = checkedRowMap.hasOwnProperty(id);
				if (hasKey == false) {
					let row = dtable.fnGetData($(this).parents("tr")[0]);
					checkedRowMap[id] = row;
				}
			});
		}
		
		//若取消选中checkbox
		if (obj.checked == false) {
			//将check-item样式的checkbox置为不选中
			$(".checker.check-item").each(function () {
				this.checked = false;
                $(this).parents("tr").eq(0).removeClass("chooseRow");
            });
			//删除check-item样式的checkbox的关联信息。
			$(".checker.check-item").each(function () {
				//删除id
				let id = $(this).data("id");
				let index = checkedIdArray.indexOf(id);
				if (index != -1) {
					checkedIdArray.splice(index, 1);
				}
				//删除row
				let hasKey = checkedRowMap.hasOwnProperty(id);
				if (hasKey == true) {
					delete checkedRowMap[id];
				}
			});
		}
	}
	
	/**
	 * 点击checkbox[check-item]时,更新checkedIdArray等变量。
	 * @param
	 * @return
	 * @author cjw 2020-06-14
	 */
	function clickCheckItem(obj) {
		//若用户选中了checkbox
		if (obj.checked == true) {
            $(obj).parents("tr").eq(0).addClass("chooseRow");
			//更新checkbox[check-all].checked值。
			let checkboxNumOfPage = $(".checker.check-item").length;
			let checkboxCheckedNumOfPage = $(".checker.check-item:checked").length;
			if (checkboxNumOfPage > 0 && checkboxNumOfPage == checkboxCheckedNumOfPage) {
				$(".checker.check-all").prop("checked", true);
			}
			//存入id
			let id = $(obj).data("id");
			let index = checkedIdArray.indexOf(id);
			if (index == -1) {
				checkedIdArray.push(id);
			}
			//存入row
			let hasKey = checkedRowMap.hasOwnProperty(id);
			if (hasKey == false) {
				let row = dtable.fnGetData($(obj).parents("tr")[0]);
				checkedRowMap[id] = row;
			}
		}
		
		//若用户取消选中checkbox。
		if (obj.checked == false) {
			//更新checkbox[check-all].checked值。
            $(obj).parents("tr").eq(0).removeClass("chooseRow");
            $(".checker.check-all").prop("checked", false);
			//删除id
			let id = $(obj).data("id");
			let index = checkedIdArray.indexOf(id);
			if (index != -1) {
				checkedIdArray.splice(index, 1);
			}
			//删除row
			let hasKey = checkedRowMap.hasOwnProperty(id);
			if (hasKey == true) {
				delete checkedRowMap[id];
			}
		}
	}
	
	/**
	 * 将checkedRowMap转为数组(checkedRowArray),并返回checkedRowArray。
	 * @param
	 * @return
	 * @author cjw 2020-06-14
	 */
	this.getCheckedRowArray = function getCheckedRowArray() {
		//console.log("checkedIdArray", checkedIdArray);
		//console.log("checkedRowMap", checkedRowMap);
		
		let checkedRowArray = [];
		if (Object.keys(checkedRowMap).length > 0 && checkedIdArray.length > 0) {
			for (let key in checkedIdArray) {
				checkedRowArray.push(checkedRowMap[checkedIdArray[key]])
			}
		}
		return checkedRowArray;
	};
}

